package vectorstore

import (
	"fmt"

	"github.com/sirupsen/logrus"
)

// IndexerType 索引器类型枚举
type IndexerType string

const (
	// IndexerTypeFAISS FAISS索引器类型
	IndexerTypeFAISS IndexerType = "faiss"
	// IndexerTypeChroma Chroma索引器类型
	IndexerTypeChroma IndexerType = "chroma"
	// IndexerTypeMilvus Milvus索引器类型
	IndexerTypeMilvus IndexerType = "milvus"
	// IndexerTypePinecone Pinecone索引器类型
	IndexerTypePinecone IndexerType = "pinecone"
	// IndexerTypeMemory 内存索引器类型（已在indexer包中实现）
	IndexerTypeMemory IndexerType = "memory"
)

// IndexerConfig 索引器配置接口
type IndexerConfig interface {
	GetDimension() int
	GetMetricType() string
}

// CreateIndexer 根据类型和配置创建索引器
func CreateIndexer(indexerType IndexerType, config IndexerConfig) (Indexer, error) {
	logrus.WithField("type", indexerType).Info("创建索引器")

	switch indexerType {
	case IndexerTypeFAISS:
		if faissConfig, ok := config.(*FaissIndexerConfig); ok {
			return NewFaissIndexer(faissConfig)
		}
		return nil, fmt.Errorf("无效的FAISS配置类型")

	case IndexerTypeChroma:
		if chromaConfig, ok := config.(*ChromaIndexerConfig); ok {
			return NewChromaIndexer(chromaConfig)
		}
		return nil, fmt.Errorf("无效的Chroma配置类型")

	case IndexerTypeMilvus:
		if milvusConfig, ok := config.(*MilvusIndexerConfig); ok {
			return NewMilvusIndexer(milvusConfig)
		}
		return nil, fmt.Errorf("无效的Milvus配置类型")

	case IndexerTypePinecone:
		if pineconeConfig, ok := config.(*PineconeIndexerConfig); ok {
			return NewPineconeIndexer(pineconeConfig)
		}
		return nil, fmt.Errorf("无效的Pinecone配置类型")

	case IndexerTypeMemory:
		// 内存索引器已在indexer包中实现
		return nil, fmt.Errorf("内存索引器应在indexer包中创建")

	default:
		return nil, fmt.Errorf("未知的索引器类型: %s", indexerType)
	}
}

// GetIndexerTypeFromString 根据字符串获取索引器类型
func GetIndexerTypeFromString(indexerTypeStr string) (IndexerType, error) {
	switch indexerTypeStr {
	case "faiss":
		return IndexerTypeFAISS, nil
	case "chroma":
		return IndexerTypeChroma, nil
	case "milvus":
		return IndexerTypeMilvus, nil
	case "pinecone":
		return IndexerTypePinecone, nil
	case "memory":
		return IndexerTypeMemory, nil
	default:
		return "", fmt.Errorf("未知的索引器类型: %s", indexerTypeStr)
	}
}
